#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN=1e5+10;
int T,n,m,L,V,c,pt,tp,pp,cnt,ls,ans,d[MAXN],p[MAXN];
double v[MAXN],a[MAXN];
bool f,flag[MAXN],vis[MAXN];
vector<int> vct,vec[MAXN];
struct special {
    int st,ed,ind,s,e,l;
}sp[MAXN],ps[MAXN];
bool cmp(special x,special y) {
    return x.st<y.st;
}
bool cmp2(special x,special y) {
    return x.l<y.l;
}
double calc_v(double v0,double ac,int s) {
    return sqrt(v0*v0+2*ac*s);
}
int bnr_s(int x,int y) {
    int lft=x,rgt=m;
    int mid=(lft+rgt+1)/2;
    while(lft<rgt) {
        if(p[mid]>y) rgt=mid-1;
        else lft=mid;
        mid=(lft+rgt+1)/2;
    }
    return rgt;
}
/*void dfs(int dep) {
    if(dep>=pp) {
        if(ls<ans) ans=ls;
        return;
    }
    if(vis[ps[pp].ind]) dfs(dep+1);
    for(int i=ps[dep].s;i<=ps[dep].e;i++) {
        flag[i]=true;
        ls++;
        if(i==m&&f) ls--;
        for(int j=0;j<vec[i].size();j++)
            vis[vec[i][j]]=true;
        dfs(dep+1);
        for(int j=0;j<vec[i].size();j++)
            vis[vec[i][j]]=false;
        ls--;
        if(i==m&&f) ls++;
    }
    return;
}*/
/*void dfs(int dep) {
    if(c==pp) {
        ans=min(ans,ls);
        return;
    }
    if(dep>m) {
        return;
    }
    for(int i=0;i<vec[dep].size();i++) {
        if(!vis[vec[dep][i]]) {
            vct.push_back(vec[dep][i]);
            c++;
        }
    }
    for(int i=0;i<vct.size();i++) 
        vis[vct[i]]=true;
    ls++;
    if(dep==m&&f) ls--;
    dfs(dep+1);
    for(int i=0;i<vct.size();i++) 
        vis[vct[i]]=false;
    ls--;
    if(dep==m&&f) ls++;
    dfs(dep+1);
    return;
}*/
bool check() {
    for(int i=0;i<pp;i++) {
        bool pd=false;
        for(int j=1;j<=m;j++) {
            if(!vis[j]) continue;
            if(j>=ps[i].s&&j<=ps[i].e) {
                pd=true;
                break;
            }
        }
        if(!pd) return false;
    }
    return true;
}
void dfs(int dep) {
    if(dep>m) {
        if(check()) ans=min(ans,ls);
        return;
    }
    vis[dep]=true;
    ls++;
    dfs(dep+1);
    vis[dep]=false;
    if(dep<m) ls--;
    if(dep==m&&!f) ls--;
    dfs(dep+1);
    if(dep==m&&f) ls--;
    return;
}
int main() {
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d%d%d",&n,&m,&L,&V);
        pt=0;
        tp=0;
        pp=0;
        cnt=0;
        ls=0;
        c=0;
        ans=m;
        f=false;
        memset(flag,false,sizeof(flag));
        memset(vis,false,sizeof(vis));
        vct.clear();
        for(int i=1;i<=m;i++) vec[i].clear();
        for(int i=1;i<=n;i++) 
            scanf("%d%lf%lf",d+i,v+i,a+i);
        for(int i=1;i<=m;i++) scanf("%d",p+i);
        for(int i=1;i<=n;i++) {
            if(d[i]>p[m]) continue;
            if(a[i]==0) {
                if(v[i]>V) {
                    cnt++;
                    //cout<<i<<endl;
                    f=true;
                }
            }
            else if(a[i]>0) {
                double vt=calc_v(v[i],a[i],p[m]-d[i]);
                if(vt>V) {
                    cnt++;
                    //cout<<i<<endl;
                    f=true;
                }
            }
            else {
                if(v[i]<=V) continue;
                sp[pt].st=d[i];
                double tm=(V-v[i])/a[i];
                sp[pt].ed=floor(d[i]+(v[i]+V)/2*tm);
                if(d[i]+(v[i]+V)/2*tm==floor(d[i]+(v[i]+V)/2*tm))
                    sp[pt].ed--;
                sp[pt].ind=i;
                pt++;
            }
        }
        if(f) ans=1;
        else ans=0;
        /*sort(sp,sp+pt,cmp);
        //for(int i=0;i<pt;i++)
        //cout<<sp[i].st<<' '<<sp[i].ed<<' '<<sp[i].ind<<endl;
        for(int i=1;i<=m&&tp<pt;i++) {
            //cout<<sp[tp].ind<<endl;
            while(p[i]>sp[tp].ed) {
                tp++;
                if(tp==pt) break;
            }
            if(tp==pt) break;
            if(p[i]<sp[tp].st) continue;
            cnt++;
            //cout<<sp[tp].ind<<endl;
            ps[pp].s=i;
            ps[pp].e=bnr_s(i,sp[tp].ed);
            ps[pp].l=ps[pp].e+1-i;
            ps[pp].ind=sp[tp].ind;
            for(int j=i;j<=ps[pp].e;j++)
                vec[j].push_back(pp);
            pp++;
            tp++;
            i--;
        }
        //sort(ps,ps+pp,cmp2);
        //if(f) ls++;
        dfs(1);*/
        printf("%d %d\n",cnt,m-ans);
    }
    return 0;
}